#include<iostream>
#include<cstring> // 包含strlen函数
using namespace std;
int next1[2000005];
// 构建 next 数组
void build(const char *a) {
    next1[0] = -1;
    int k = -1;
    int len = strlen(a);
    for(int i = 0; i < len; i++) {
        while (k >= 0 && a[k] != a[i]) {
            k = next1[k];
        }
        next1[i + 1] = ++k;
    }
}
// KMP 匹配函数
void kmp(const char *a, const char *b) {
    int l1 = 0;
    int len_a = strlen(a);
    int len_b = strlen(b);
    int l2=0;
    while ( l2 < len_b) {
        if (a[l1] == b[l2]) {
            l1++;
            l2++;
        } else {
            l1 = next1[l1]; // 匹配失败，回退到 next 数组的位置
            if (l1 == -1) { // 如果回退到 -1，说明完全不匹配，继续从下一个字符开始
                l1 = 0;
                l2++;
            }
        }
        if (l1 == len_a) {
            cout<<l2 - len_a+1<<endl;
            l1=next1[l1];
        } // 完全匹配，返回匹配的起始位置
    }
}
int main() {
    char a[2000002], b[2000002];
    cin >> a >> b; // 输入字符串 a 和 b
    int len_a = strlen(a);
    int len_b = strlen(b);
    if (len_b == 0) {
        for(int i = 0; i <= len_a; i++) {
            cout << i << endl;
        }
        for(int i = 0; i <= len_b; i++) {
            cout << next1[i] << " ";
        }
        cout << endl;
        return 0;
    }
    int x = 0;
    build(b); // 构建模式串 b 的 next 数组
    kmp(b, a); // 查找模式串 b 在文本串 a 中的位置
    // 输出 next 数组的值
    for(int i = 1; i <= len_b; i++) {
        cout << next1[i] << " ";
    }
    cout << endl;
    return 0;
}
